home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Desktop Improver / AppSize / AppSize.c < prev    next >
C/C++ Source or Header  |  1996-09-26  |  11KB  |  313 lines

  1. /*
  2. ** `size' mit AppIcon - Liest Verzeichnisse ein und spuckt die Größe aus
  3. ** Autor: Roland Jesse
  4. ** Compiler: GNU-C v2.3.3
  5. ** Status: Freeware
  6. */
  7.  
  8. #include <stdio.h>
  9.  
  10. #include <dos/dos.h>
  11. #include <dos/dosasl.h>
  12. #include <exec/memory.h>
  13. #include <graphics/gfx.h>
  14. #include <graphics/GfxBase.h>
  15. #include <intuition/intuition.h>
  16. #include <intuition/intuitionbase.h>
  17. #include <workbench/startup.h>
  18. #include <workbench/workbench.h>
  19.  
  20. #define PATHLENGTH   (256)
  21. #define APEN (1)
  22.  
  23. struct DOSBase *DOSBase = NULL;
  24. struct GfxBase *GfxBase = NULL;
  25. struct IntuitionBase *IntuitionBase = NULL;
  26. struct WorkbenchBase *WorkbenchBase = NULL;
  27.  
  28. char *ver = "$VER: AppSize 1.3 ("__DATE__")";
  29.  
  30. LONG Bytes = NULL;                        /* Summe der Filelängen */
  31. LONG DirAnz  = NULL;                      /*   "    "  Verz.      */
  32. LONG FileAnz = NULL;                      /*   "    "  Dateien    */
  33. UBYTE ScanDir[ PATHLENGTH ];              /* Name des Scan-Dirs   */
  34.  
  35. WORD line = NULL;                         /* Fonthöhe */
  36.  
  37. struct TextFont *myfont = NULL;           /* Ptr. auf Systemfont */
  38. struct Window *win = NULL;                /* Ptr. auf Ausgabefenster */
  39.  
  40. struct NewWindow nwin = {
  41.  150,50, 0,0, -1,-1,
  42.  IDCMP_CLOSEWINDOW,
  43.  WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_ACTIVATE | WFLG_DEPTHGADGET |
  44.  WFLG_SMART_REFRESH, /* Window->Flags */
  45.  NULL, NULL,
  46.  (UBYTE *) "AppSize 1.3 ("__DATE__")",
  47.  NULL, NULL,
  48.  7,7,7,7,
  49.  WBENCHSCREEN,
  50. };
  51.  
  52. /* Source Daten für das OriIcon (wichtig, solange der GNU-CC nicht mit
  53. ** der IconBase (_IconBase ?) klarkommt.
  54. ** wenn doch einmal: GetDiskObjectNew() aus icon.library <
  55. ** (Ist latürnich der Compiler schuld :-))
  56. */
  57.  
  58. USHORT MyImageData[] =
  59. {
  60.  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0000, 0x0000,
  61.  0x0000, 0x0000, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x0000, 0x0000,
  62.  0x0000, 0x0000, 0x0FF0, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000,
  63.  0x0000, 0x0000, 0x3E7C, 0x0000, 0x0000, 0x0000, 0x0000, 0x781E, 0x0000, 0x0000,
  64.  0x0000, 0x0000, 0xFE7F, 0x0000, 0x0000, 0x0000, 0x0001, 0xFFFF, 0x8000, 0x0000,
  65.  0x0000, 0x0003, 0xFFFF, 0xC000, 0x0000, 0x0000, 0x0007, 0xFFFF, 0xE000, 0x0000,
  66.  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x0000, 0x1400, 0x0000,
  67.  0x0000, 0x01E0, 0x0000, 0x0780, 0x0000, 0x0000, 0x1FE0, 0x0000, 0x07F8, 0x0000,
  68.  0x0000, 0xFFE0, 0x0000, 0x07FF, 0x0000, 0x0007, 0xF3E0, 0x0000, 0x07E7, 0xE000,
  69.  0x007F, 0xF3E0, 0x0000, 0x07E7, 0xFE00, 0x03FF, 0xC0E0, 0x01C0, 0x0781, 0xFFC0,
  70.  0x007F, 0xF3E0, 0x0000, 0x07E7, 0xFE00, 0x0007, 0xF3E0, 0x0000, 0x07E7, 0xE000,
  71.  0x0000, 0xFFE0, 0x0000, 0x07FF, 0x0000, 0x0000, 0x1FE0, 0x0000, 0x07F8, 0x0000,
  72.  0x0000, 0x01E0, 0x0000, 0x0780, 0x0000, 0x0000, 0x0028, 0x0000, 0x1400, 0x0000,
  73.  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0xFFFF, 0xE000, 0x0000,
  74.  0x0000, 0x0003, 0xFFFF, 0xC000, 0x0000, 0x0000, 0x0001, 0xFFFF, 0x8000, 0x0000,
  75.  0x0000, 0x0000, 0xFE7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x781E, 0x0000, 0x0000,
  76.  0x0000, 0x0000, 0x3E7C, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000,
  77.  0x0000, 0x0000, 0x0FF0, 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x0000, 0x0000,
  78.  0x0000, 0x0000, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0000, 0x0000,
  79.  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0000, 0x0000,
  80.  0x0000, 0x0000, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x0000, 0x0000,
  81.  0x0000, 0x0000, 0x0FF0, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000,
  82.  0x0000, 0x0000, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFE, 0x0000, 0x0000,
  83.  0x0000, 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0001, 0xFFFF, 0x8000, 0x0000,
  84.  0x0000, 0x0003, 0xFFFF, 0xC000, 0x0000, 0x0000, 0x0007, 0xFFFF, 0xE000, 0x0000,
  85.  0x0000, 0x000F, 0xFFFF, 0xF000, 0x0000, 0x0000, 0x003F, 0xFFFF, 0xFC00, 0x0000,
  86.  0x0000, 0x01F7, 0xFFFF, 0xEF80, 0x0000, 0x0000, 0x1FFF, 0xFFFF, 0xFFF8, 0x0000,
  87.  0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0007, 0xFFFF, 0xFFFF, 0xFFFF, 0xE000,
  88.  0x007F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFE00, 0x03FF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFC0,
  89.  0x0FFF, 0xFFFF, 0xFE3F, 0xFFFF, 0xFFF0, 0x03FF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFC0,
  90.  0x007F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFE00, 0x0007, 0xFFFF, 0xFFFF, 0xFFFF, 0xE000,
  91.  0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x1FFF, 0xFFFF, 0xFFF8, 0x0000,
  92.  0x0000, 0x01F7, 0xFFFF, 0xEF80, 0x0000, 0x0000, 0x003F, 0xFFFF, 0xFC00, 0x0000,
  93.  0x0000, 0x000F, 0xFFFF, 0xF000, 0x0000, 0x0000, 0x0007, 0xFFFF, 0xE000, 0x0000,
  94.  0x0000, 0x0003, 0xFFFF, 0xC000, 0x0000, 0x0000, 0x0001, 0xFFFF, 0x8000, 0x0000,
  95.  0x0000, 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFE, 0x0000, 0x0000,
  96.  0x0000, 0x0000, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000,
  97.  0x0000, 0x0000, 0x0FF0, 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x0000, 0x0000,
  98.  0x0000, 0x0000, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0000, 0x0000,
  99. };
  100.  
  101. struct Image MyImage =
  102. {
  103.   0, 0, 76, 39, 2, &MyImageData[0], 3, 0, NULL
  104. };
  105.  
  106. struct DiskObject Icon =
  107. {
  108.   WB_DISKMAGIC, WB_DISKVERSION,
  109.   {
  110.    NULL, 230, 175, 76, 40,
  111.    GADGIMAGE | GADGHCOMP, RELVERIFY | GADGIMMEDIATE, BOOLGADGET,
  112.    (APTR) &MyImage, (APTR) &MyImage,
  113.    NULL, NULL, NULL, 0, NULL,
  114.   },
  115.   NULL, NULL, NULL, NO_ICON_POSITION, NO_ICON_POSITION,  NULL, NULL, NULL
  116. };
  117.  
  118. /* Schließt alle Libs */
  119. void CloseAll (void)
  120. {
  121.    if (WorkbenchBase) CloseLibrary (WorkbenchBase);
  122.    if (IntuitionBase) CloseLibrary (IntuitionBase);
  123.    if (GfxBase) CloseLibrary (GfxBase);
  124.    if (DOSBase) CloseLibrary (DOSBase);
  125. }
  126.  
  127. /* Öffnet alle benötigten Libs */
  128. void OpenAll()
  129. {
  130.    DOSBase = (struct DOSBase *)OpenLibrary ("dos.library", 37);
  131.    GfxBase = (struct GfxBase *)OpenLibrary ("graphics.library", 37);
  132.    IntuitionBase = (struct IntuitionBase *)OpenLibrary ("intuition.library", 37);
  133.    WorkbenchBase = (struct WorkbenchBase *)OpenLibrary ("workbench.library", 37);
  134.    if (!WorkbenchBase | !IntuitionBase | !GfxBase |!DOSBase)
  135.       CloseAll ();
  136. } /* OpenAll */
  137.  
  138. OpenDisplay ()
  139. {
  140.  struct TextFont *memfont = NULL;
  141.  struct Screen *ascr = NULL;
  142.  
  143.    myfont = GfxBase->DefaultFont;
  144.    if (!myfont) CloseAll ();
  145.  
  146.    nwin.Height = 7 * (myfont->tf_YSize + 2);
  147.  
  148.    ascr = IntuitionBase->ActiveScreen;
  149.    if (!ascr) CloseAll ();
  150.  
  151.    Forbid();
  152.    memfont = ascr->RastPort.Font;
  153.    SetFont (ascr->RastPort, myfont);
  154.    nwin.Width = TextLength (&ascr->RastPort, ver, strlen(ver))+100;
  155.    SetFont (ascr->RastPort, memfont);
  156.    Permit();
  157.  
  158.    if (nwin.TopEdge + nwin.Height > ascr->Height)
  159.       nwin.TopEdge = ascr->Height - nwin.Height;
  160.    if (nwin.Height < 0) CloseAll ();
  161.    if (nwin.LeftEdge + nwin.Width > ascr->Width)
  162.       nwin.LeftEdge = ascr->Width - nwin.Width;
  163.    if (nwin.Width < 0) CloseAll ();
  164.  
  165.    win = (struct Window *)OpenWindow (&nwin);
  166.    if (!win) CloseAll ();
  167.  
  168.    SetFont (win->RPort, myfont);
  169.    line = myfont->tf_YSize + 1;
  170.    SetAPen(win->RPort, APEN);
  171. } /* OpenDisplay */
  172.  
  173. void Print (struct RastPort rp, SHORT x, SHORT y, STRPTR text)
  174. {
  175.    Move (&rp, x, y);
  176.    Text (&rp, text, strlen (text));
  177. } /* Print */
  178.  
  179. /* Scannt rekursiv das angegebene Verz. und liefert die Größe zurück
  180. ** in: (char) Verzeichnispfad
  181. ** out: (long) Größe
  182. */
  183. BOOL Scannen(STRPTR Pfad)
  184. {
  185.  BOOL GeSized = FALSE;              /* out: TRUE=geScanned!, FALSE=Fehler */
  186.  BOOL NextSucc = TRUE;              /* Testwert für Scan v. Unterverz. */
  187.  BOOL CurrDir = FALSE;              /* Testwert, ob StartDir gesichert */
  188.  BOOL Raus = FALSE;                 /* Ctrl-C gedrückt ? */
  189.  BPTR OldDir;                       /* Alten VerzeichnisLock sichern */
  190.  BPTR VerzLock = NULL;              /* Lock auf ScanVerzeichnis */
  191.  struct FileInfoBlock *FIB = NULL;  /* für Examine() & ExNext() */
  192.  LONG Error;                        /* richtiges IoErr() bei Ctrl-C */
  193.  
  194.  if(VerzLock = Lock(Pfad, ACCESS_READ))
  195.  {
  196.   NameFromLock (VerzLock, ScanDir, PATHLENGTH);
  197.   Print (*win->RPort, 5, 3*line, ScanDir);
  198.   OldDir = CurrentDir (VerzLock);
  199.   if (!IoErr())
  200.   {
  201.    CurrDir = TRUE;
  202.    DirAnz++;
  203.    if(FIB = (struct FileInfoBlock *)AllocDosObject(DOS_FIB, NULL))
  204.    {
  205.     if(Examine(VerzLock, FIB))
  206.     {
  207.      while( NextSucc && !(Raus = CheckSignal( SIGBREAKF_CTRL_C ) != 0)
  208.            && ExNext(VerzLock, FIB) )
  209.      {
  210.       if(FIB->fib_DirEntryType < 0)
  211.       {
  212.        Bytes += FIB->fib_Size;
  213.        FileAnz++;
  214.       } else if( NextSucc = Scannen( FIB->fib_FileName ));
  215.      }
  216.      if(IoErr() == ERROR_NO_MORE_ENTRIES) GeSized = TRUE;
  217.     }
  218.    }
  219.   }
  220.  }
  221.  if(Raus) Error = ERROR_BREAK;                                     /*>-+ */
  222.  else Error = IoErr();                                             /*>-+ */
  223.                                                                    /*  | */
  224.  if(FIB) FreeDosObject(DOS_FIB, FIB);                              /*  | */
  225.  if(CurrDir) CurrentDir(OldDir);                                   /*  | */
  226.  if(VerzLock) UnLock(VerzLock);                                    /*  | */
  227.                                                                    /*  | */
  228.  SetIoErr(Error);                                                  /*<-+ */
  229.  return(GeSized);
  230. }
  231.  
  232. main(int argc, char **argv)
  233. {
  234.  struct MsgPort *msgport = NULL;      /* Messageport für AppIcon */
  235.  struct AppIcon *appicon = NULL;      /* Struktur     "  AppIcon */
  236.  struct AppMessage *appmsg = NULL;
  237.  struct IntuiMessage *imsg = NULL;
  238.  struct WBArg *argptr = NULL;
  239.  ULONG IconID = 1, UserData = 0;
  240.  BOOL ABORT = FALSE;
  241.  UBYTE i;
  242.  char bstr[25];                /* Strings für die Ausgabe der Ergebnisse */
  243.  char dstr[25];
  244.  char vstr[25];
  245.  
  246.  if (argc != 0)
  247.  {
  248.   printf ("Programm bitte von Workbench starten!\n");
  249.   exit (RETURN_WARN);
  250.  }
  251.  
  252.  OpenAll();
  253.  if (msgport = (struct MsgPort *)CreateMsgPort())
  254.  {
  255.   if (appicon = (struct AppIcon *)AddAppIcon (IconID, UserData,
  256.                 "!BITTE bewerfen!", msgport, NULL, &Icon, NULL))
  257.   {
  258.     do
  259.     {
  260.      Wait (1 << msgport->mp_SigBit);
  261.      while (appmsg = (struct AppMessage *)GetMsg (msgport))
  262.      {
  263.       if (!appmsg->am_NumArgs)
  264.       {
  265.        ABORT = TRUE;
  266.        ReplyMsg ((struct Message *)appmsg);
  267.       }
  268.       else
  269.       {
  270.        ABORT = FALSE;
  271.        OpenDisplay();
  272.        Print (*win->RPort, 5, 2*line, "Moment, Scannphase ...");
  273.        argptr = appmsg->am_ArgList;
  274.        for( i=0; i < appmsg->am_NumArgs; i++ )
  275.        {
  276.         NameFromLock (argptr->wa_Lock, ScanDir, PATHLENGTH);
  277.         Scannen (ScanDir);
  278.         argptr++;
  279.        }
  280.  
  281.        NameFromLock (appmsg->am_ArgList->wa_Lock, ScanDir, PATHLENGTH);
  282.        Print (*win->RPort, 5, 3*line, ScanDir);
  283.  
  284.        sprintf (bstr, "Bytes: %15ld", Bytes);
  285.        sprintf (dstr, "Dateien: %13ld", FileAnz);
  286.        sprintf (vstr, "Verzeichnisse: %7ld", DirAnz);
  287.  
  288.        Print (*win->RPort, 5, 4*line, bstr);
  289.        Print (*win->RPort, 5, 5*line, dstr);
  290.        Print (*win->RPort, 5, 6*line, vstr);
  291.        Print (*win->RPort, 5, 7*line, "Bitte CLOSE Gadget betätigen!");
  292.  
  293.        ReplyMsg ((struct Message *)appmsg);
  294.       } /* kein Doppelklick */
  295.      } /* appmsg = GetMsg(...) */
  296.      appmsg = NULL;
  297.      if (!ABORT)
  298.      {
  299.        Wait (1 << msgport->mp_SigBit | 1 << win->UserPort->mp_SigBit);
  300.        while (appmsg = (struct AppMessage *)GetMsg (msgport))
  301.         ReplyMsg ((struct Message *) appmsg);
  302.        while (imsg = (struct IntuiMessage *)GetMsg (win->UserPort))
  303.         ReplyMsg ((struct Message *) imsg);
  304.        CloseWindow (win);
  305.      }
  306.     } while (FALSE == ABORT); /* AppI-Abfrage */
  307.    RemoveAppIcon (appicon);
  308.   } else fprintf (stderr, "AppSize: Fehler bei AddAppIcon\n");
  309.   DeleteMsgPort (msgport);
  310.  } else fprintf(stderr,"AppSize: Konnte Message-Port nicht einrichten.\n");
  311.  CloseAll ();
  312. } /* main */
  313.